home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Alert.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  4KB  |  207 lines

  1. #include "Alert.h"
  2. #include "Buttons.h"
  3. #include "BorderItems.h"
  4. #include "CheapText.h"
  5. #include "StaticTView.h"
  6. #include "StyledText.h"
  7. #include "ObjList.h"
  8. #include "WindowSystem.h"
  9. #include "BlankWin.h"
  10. #include "ObjectTable.h"
  11.  
  12. static u_short NoteBits[]= {
  13. #   include "images/note.image"
  14. };
  15.  
  16. static u_short CautionBits[]= {
  17. #   include "images/caution.image"
  18. };
  19.  
  20. static u_short StopBits[]= {
  21. #   include "images/stop.image"
  22. };
  23.  
  24. static u_short SunBits[]= {
  25. #   include "images/sun.image"
  26. };
  27.  
  28. static u_short ErrorBits[]= {
  29. #   include "images/error.image"
  30. };
  31.  
  32. static Alert *noteAlert,
  33.          *cautionAlert,
  34.          *stopAlert,
  35.          *messageAlert,
  36.          *sunAlert,
  37.          *errorAlert;
  38.                 
  39. MetaImpl(Alert, (TP(text), TP(image), TP(buttons), 0));
  40.  
  41. Alert::Alert(AlertType at, byte *message, Bitmap *va_(bm), ...)
  42.                         : Dialog(0, eBWinOverlay+eBWinBlock)
  43. {
  44.     va_list ap;
  45.     ObjList *ol;
  46.  
  47.     if (message == 0)
  48.     return;
  49.  
  50.     text= new StaticTextView((View*)0, Rectangle(gSysFont->Width('n')*40,cFit),
  51.                         new CheapText(message));
  52.  
  53.     if (va_(bm))
  54.     image= new ImageItem(va_(bm));
  55.  
  56.     if (at == eAlertMessage)
  57.     image= text;
  58.     else
  59.     image= new Cluster(2, eVObjVTop, 25, image, text, 0);
  60.  
  61.     ol= new ObjList;
  62.     buttons= new Cluster(2, eVObjVBase, 20, ol);
  63.  
  64.     va_start(ap,va_(bm));
  65.     char *s;
  66.     for (int i= 0; s= va_arg(ap, char*); i++)
  67.     ol->Add(new ActionButton(va_arg(ap, int), s, i == 0));   
  68.     va_end(ap);
  69. }
  70.  
  71. Alert::~Alert()
  72. {
  73.     if (text) {
  74.     Text *t= ((StaticTextView*)text)->GetText();
  75.     SafeDelete(t);
  76.     SafeDelete(text);
  77.     this= 0;    // hack
  78.     }
  79. }
  80.  
  81. VObject *Alert::DoCreateDialog()
  82. {
  83.     return 
  84.     new BorderItem(
  85.         new BorderItem(
  86.         new Cluster(2, eVObjHLeft, gPoint10, image, buttons, 0),
  87.         Point(15),
  88.         3
  89.         ),
  90.         gPoint2,
  91.         1
  92.     );
  93. }
  94.  
  95. int Alert::Show(char* va_(fmt), ...)
  96. {
  97.     int code;
  98.     va_list ap;
  99.     
  100.     va_start(ap,va_(fmt));
  101.     code= ShowV(va_(fmt), ap);
  102.     va_end(ap);
  103.     return code;
  104. }
  105.  
  106. int Alert::ShowV(char *fmt, va_list ap)
  107. {
  108.     int ret;
  109.  
  110.     if (image->IsKindOf(Cluster))
  111.     ((Cluster*)image)->SetModified();
  112.     char *buf= strvprintf(fmt, ap);
  113.     if (gWinInit) {
  114.     Text *tmpp= ((StaticTextView*)text)->SetText(new StyledText(gSysFont, buf));
  115.     delete tmpp;
  116.     CalcLayout(FALSE);
  117.     ret= Dialog::Show();
  118.     } else {
  119.     cerr << buf NL;
  120.     ret= cIdNo;
  121.     }    
  122.     SafeDelete(buf);
  123.     return ret;
  124. }
  125.  
  126. class Menu *Alert::GetMenu()
  127. {
  128.     return 0;
  129. }
  130.  
  131. void Alert::InspectorId(char *buf, int sz)
  132. {
  133.     if (text)
  134.     text->InspectorId(buf, sz);
  135.     else
  136.     Dialog::InspectorId(buf, sz);   
  137. }
  138.  
  139. bool TestInterrupt(char *what)
  140. {
  141.     if (Interrupted())
  142.     return ShowAlert(eAlertStop, "Abort %s?", what) == cIdYes;
  143.     return FALSE;
  144. }
  145.  
  146. int ShowAlert(AlertType at, char* va_(fmt), ...)
  147. {
  148.     va_list ap;
  149.     Alert *al= 0;
  150.     Object *root= 0;
  151.     
  152.     va_start(ap, va_(fmt));
  153.     
  154.     switch (at) {
  155.     case eAlertNote:
  156.     if (noteAlert == 0)
  157.         root= noteAlert= new Alert(at, (byte*) "note",
  158.             new Bitmap(Point(64, 52), NoteBits), "OK", cIdOk, 0);
  159.     al= noteAlert;
  160.     break;
  161.     case eAlertCaution:
  162.     if (cautionAlert == 0) {
  163.         root= cautionAlert= new Alert(at, (byte*) "Caution", 
  164.             new Bitmap(Point(64, 52), CautionBits),
  165.                     "Yes",    cIdYes,
  166.                     "No",     cIdNo,
  167.                     "Cancel", cIdCancel, 0);
  168.     }
  169.     al= cautionAlert;
  170.     break;
  171.     case eAlertStop:
  172.     if (stopAlert == 0)
  173.         root= stopAlert= new Alert(at, (byte*) "Stop",
  174.             new Bitmap(64, StopBits),
  175.                      "Yes",    cIdYes,
  176.                      "No",     cIdNo,
  177.                      "Cancel", cIdCancel, 0);
  178.     al= stopAlert;
  179.     break;
  180.     case eAlertSun:
  181.     if (sunAlert == 0)
  182.         root= sunAlert= new Alert(at, (byte*) "Message",
  183.             new Bitmap(64, SunBits), "Ok", cIdOk, 0);
  184.     al= sunAlert;
  185.     break;
  186.     case eAlertError:
  187.     if (errorAlert == 0)
  188.         root= errorAlert= new Alert(at, (byte*) "Error",
  189.             new Bitmap(64, ErrorBits),
  190.                       "Ignore",     cIdIgnore,
  191.                       "Dump Core",  cIdAbort,
  192.                       "Inspect",    cIdInspect, 0);
  193.     al= errorAlert;
  194.     break;
  195.     case eAlertMessage:
  196.     if (messageAlert == 0)
  197.         root= messageAlert= new Alert(at, (byte*) "Message", 0, "Ok", cIdOk, 0);
  198.     al= messageAlert;
  199.     break;
  200.     }
  201.     if (root)
  202.     ObjectTable::AddRoot(root);
  203.     int code= al->ShowV(va_(fmt), ap);
  204.     va_end(ap);
  205.     return code;
  206. }
  207.